package org.tri.form;

import java.awt.Point;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.tri.entity.Animal;
import org.tri.entity.Venta;

/**
 * La clase {@code TRI} representa el documento TRI utilizado como comprobante
 * para ventas realizadas.
 * @author kiira
 * @version 1.0, Jan 7, 2012
 */
public class TRI extends Form {

    /** Nombre del template para el form. */
    private final static String TEMPLATE = "TRI";
    
    /** Celda donde se ubica el nombre del destinatario. */
    private final static Point DESTINO_NOMBRE = new Point( 0, 4 );
    /** Celda donde se ubica la renspa del destinatario. */
    private final static Point DESTINO_RENSPA = new Point( 3, 4 );
    /** Celda donde se ubica la fecha de la venta. */
    private final static Point FECHA = new Point( 6, 4 );
    /** Celda donde ubica la primer caravana. Las demas se calculan a partir de esta. */
    private final static Point PRIMER_CARAVANA = new Point( 1, 6 );
    /** Celda donde se coloca el nombre del establecimiento de origen. */
    private final static Point ESTABLECIMIENTO = new Point( 0, 36 );
    /** Celda donde se coloca la renspa del establecimiento de origen. */
    private final static Point RENSPA = new Point( 0, 37 );
    /** Celda donde se coloca la categoria de los animales de la venta. */
    private final static Point CATEGORIA = new Point( 0, 38 );
    
    /** Cantidad máxima de caravanas por columna. */
    private final static int MAX_CARAVANA_COLUMN = 30;
    /** Salto horizontal que se realiza entre columna y columna. */
    private final static int HORIZONTAL_JUMP = 4;
    /** Cantidad máxima de caravanas por TRI. */
    public final static int CANT_MAX_CARAVANAS = 90;

    /** 
     * Inicializa el TRI utilizando los datos de una venta.
     * @param venta venta que este TRI va a representar.
     * @throws FileNotFoundException si el template del TRI no se encontro en
     * el directorio de templates.
     * @throws IOException si no se pudo abrir el template.
     * @throws InvalidFormatException  si el template esta corrupto.
     */
    public TRI( Venta venta )
            throws FileNotFoundException, IOException, InvalidFormatException {
        //inicializamos el template y el archivo de salida
        super( TEMPLATE, venta.getEstablecimiento().getNombre() );
        
        //comprobamos que no se supere la cantidad máxima de animales.
        if ( venta.getAnimales().size() > CANT_MAX_CARAVANAS )
            throw new IllegalArgumentException( 
              "La venta no puede tener mas de 90 animales para poder generar su TRI." );

        //formater para la fecha
        SimpleDateFormat format = new SimpleDateFormat( "dd/MM/yyyy" );

        //cargamos los valores básicos
        appendText( DESTINO_NOMBRE, venta.getDestinatario() );
        appendText( DESTINO_RENSPA, String.valueOf(
                venta.getRenspaDestinatario() ) );
        appendText( FECHA, format.format( venta.getFecha() ) );
        appendText( ESTABLECIMIENTO, venta.getEstablecimiento().getNombre() );
        appendText( RENSPA, String.valueOf(
                venta.getEstablecimiento().getRenspa() ) );
        appendText( CATEGORIA, venta.getCategoria().toString() );

        //cargamos las caravanas
        Point currentPos = new Point( PRIMER_CARAVANA );

        for ( Animal animal : venta.getAnimales() ) {
            appendText( currentPos, animal.getCaravana() );           
            
            currentPos.translate( 0, 1 );

            if ( currentPos.y >= PRIMER_CARAVANA.y + MAX_CARAVANA_COLUMN )
                currentPos.translate( HORIZONTAL_JUMP, -MAX_CARAVANA_COLUMN );

        }//end for

    }//end constructor

}//end clase TRI

